iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

前端新手的學習筆記系列 第 25

Day25:每天一個小練習 - JS30-10-Hold Shift and Check Checkboxes

  • 分享至 

  • xImage
  •  

學習資料:
Alex老師教學
PJCHENder筆記

鍵盤事件增強,按住shift可勾選選兩點之間的所有checkbox


抓取節點並轉為陣列

		let checkboxes = document.querySelectorAll('.inbox input[type="checkbox"]');
    //console.log(checkboxes);
    checkboxes = Array.from(checkboxes);//轉為陣列
    //console.log(checkboxes);

做出監聽

	let chickHandler = (e) => {

    };
    checkboxes.forEach(item => {
        item.addEventListener('click', chickHandler);
    });

設定第一個點擊的位置紀錄,並判斷是否打勾

let firstCheck = null; //紀錄第一個點擊的編號,先預設空值
    function chickHandler(e) {
        // console.log(e); //勾選查看事件物件內容
        //先確認是否打勾
        if (this.checked) {
		  firstCheck = checkboxes.indexOf(this); //紀錄打勾位置的編號
        } else {
          firstCheck = null; //不是打勾就清除
        }
    }

第二重判斷,是否按住Shift以及是否有先點擊第一個勾

    function chickHandler(e) {
        // console.log(e); //勾選查看事件物件內容
        //先確認是否打勾
        if (this.checked) {
            // 判斷是否有按shift && 是否有上一個被點開的check
            if (e.shiftKey && firstCheck !== null) {
                let nowCheck = checkboxes.indexOf(this); //目前點擊的位置
            }
            firstCheck = checkboxes.indexOf(this); //紀錄打勾位置的編號
        } else {
            firstCheck = null; //不是打勾就清除
        }
    }

有兩個位置的資料後進行判斷

		if (e.shiftKey && firstCheck !== null) {
            let nowCheck = checkboxes.indexOf(this); //目前點擊的位置
            // console.log(nowCheck);
            checkboxes
                // 用兩個點擊的位置切出一個區段
                .slice(
                    // 不論由前往後或由後往前按都可以選取
                    Math.min(nowCheck, firstCheck),
                    Math.max(nowCheck, firstCheck)
                )
                //用切好的區段跑forEach
                .forEach(item => {
                    return (item.checked = true);
                });
        } else {
            firstCheck = checkboxes.indexOf(this); //紀錄打勾位置編號
            // console.log(firstCheck);
        }

以上就完成了,為了操作更順暢,需要回頭修改HTML,使點擊文字也可選取打勾

<label class="item">
    <input type="checkbox">
    <p>Just regular JavaScript</p>
</label>

因為點選文字時會出現反白效果導致干擾選取,透過CSS設定使反白無效

.item {
(略)
    user-select: none;
}

這樣就完成了。

連結


上一篇
Day24:每天一個小練習 - JS30-09-Dev Tools Domination
下一篇
Day26:每天一個小練習 - JS30-11-Custom Video Player
系列文
前端新手的學習筆記32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言